package com.example.demo_mysql_mybatisplus.util.grouped;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Data;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 数据分组工具
 */
@Data
public class Grouper {

    /** 分组字段 */
    private String groupField;

    /**
     *  dataObjectList  canNull    分组前的数据对象集合
     *  groupField      canNull    分组字段
     *  counterMap      canNull    每组的数量统计Map ；为null时，total=每组的数据量
     */
    public static <T> List excute(List<T> dataObjectList, String groupField, Map<Object, Long> counterMap) {
        if ( CollUtil.isNotEmpty(dataObjectList) && StrUtil.isNotEmpty(groupField)) {
            // 生成分组(保持顺序)
            LinkedHashMap<Object, GroupedPo> groupedDataMap = new LinkedHashMap();
            //// 初始组 以及Key值
            for (T dataObject : dataObjectList) {
                Object groupKey = BeanUtil.getFieldValue(dataObject, groupField );// 不是对象 需要转成json获取值
                if (!groupedDataMap.containsKey( groupKey )) {
                    groupedDataMap.put( groupKey , new GroupedPo( groupField, groupKey));
                }
            }
            //// 按组填充数据
            for (T dataObject : dataObjectList) {
                Object groupFieldVal = BeanUtil.getFieldValue(dataObject, groupField );// 不是对象 需要转成json获取值
                groupedDataMap.get( groupFieldVal ).getDatas().add(dataObject);
            }
            ////填充组的数量
            if( null!=counterMap ){
                counterMap.entrySet().forEach(entry->{
                    GroupedPo gd = groupedDataMap.get(entry.getKey());
                    if(null!=gd)gd.setTotal(entry.getValue());
                });
            }
            // 成品数据
            return groupedDataMap.values().stream().collect(Collectors.toList());
        }
        return dataObjectList ;
    }


}
